from rest_framework import serializers
from django_redis import get_redis_connection


# 校验图片验证码序列化器
class ImageCodeCheckSerializer(serializers.Serializer):
    """校验图片验证码"""
    image_code_id = serializers.UUIDField()
    text = serializers.CharField(max_length=4, min_length=4)

    def validate(self, attrs):
        """校验"""

        # 获取图片验证码id（编号）,uuid字符串
        image_code_id = attrs['image_code_id']

        # 获取图片验证码
        text = attrs['text']
        print(text)

        # 连接数据库，从数据库缓存中查询图片验证码
        conn = get_redis_connection('verify_codes')
        redis_sms_code = conn.get('image_%s' % image_code_id)

        # 判断是否存在
        if not redis_sms_code:
            raise serializers.ValidationError('图片验证码失效')

        # 删除图片验证码，防止用户在前端暴力测试同一张图片验证码
        conn.delete('image_%s' % image_code_id)

        # 比较图片验证码
        if redis_sms_code.decode().lower() != text.lower():
            raise serializers.ValidationError('图片验证码错误')

        # 发送记录：send_flag 在views里面设置为60秒记录一次
        # 从序列化器对象的view里面取出mobile
        mobile = self.context['view'].kwargs['mobile']
        send_flag = conn.get('send_flag_%s' % mobile)

        if send_flag:
            raise serializers.ValidationError('发送短信验证码太频繁，请稍候再试')

        return attrs
